package seueniumfordemoiselle.seleniumsimplify.tests;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.support.PageFactory;
import org.testng.Assert;
import org.testng.annotations.Test;

import seueniumfordemoiselle.seleniumsimplify.dataproviders.UFProvedorDeDados;
import seueniumfordemoiselle.seleniumsimplify.dto.UFDTO;
import seueniumfordemoiselle.seleniumsimplify.pages.InicialPage;
import seueniumfordemoiselle.seleniumsimplify.pages.cadastro.UFCadastroPage;
import seueniumfordemoiselle.seleniumsimplify.pages.list.UFListPage;
import seueniumfordemoiselle.seleniumsimplify.utils.TabelaListagem;

public class SimplifyUFTest extends BaseTest{

	private InicialPage page;
	
	private UFCadastroPage pageCadastro;
	
	private UFListPage pageList;
		
	@Test(dataProvider="proverUFCadastro", 
			dataProviderClass=UFProvedorDeDados.class)			
	public void cadastrarUF(UFDTO uf){
		
			//Acessa página inicial		
			page = new InicialPage(this.driver);
			
			//Acessa página de listagem de Ufs
			pageList = page.clicarMenuUF();

			//Acessar página de cadastro
			pageCadastro = pageList.clicarNovo();
					
			//Preencher cadastro			
			pageCadastro.digitarNome(uf.getNome());
			pageCadastro.digitarSigla(uf.getSigla());
			pageList = pageCadastro.clicarLinkInserir();
			
			//Verificações
			Assert.assertEquals("Entidade inserida com sucesso.",pageList.pegarMensagem());			
			Assert.assertTrue(pageList.getTabela().isRegistroPresente(UFListPage.NOME_COLUNA_NOME, uf.getNome()));
			Assert.assertTrue(pageList.getTabela().isRegistroPresente(UFListPage.NOME_COLUNA_SIGLA, uf.getSigla()));		
	}
		
	@Test(dependsOnMethods={"cadastrarUF"}, 
			dataProvider="proverUFEdicao", 
			dataProviderClass=UFProvedorDeDados.class)
	public void editarUF(UFDTO uf, UFDTO ufAlterado){
		
		//Acessa página inicial
		page = new InicialPage(this.driver);
		
		//Acessa página de listagem de Ufs
		pageList = page.clicarMenuUF();		
		
		//Verificar antes de o registro encontra-se cadastrado antes de alterar
		Assert.assertTrue(pageList.isRegistroPresente(UFListPage.NOME_COLUNA_NOME, uf.getNome()),"Registro não encontrado na listagem.");
		
		//Acesso a página de alteração
		pageCadastro = pageList.clicarAlterar(UFListPage.NOME_COLUNA_NOME, uf.getNome(), UFListPage.NOME_COLUNA_EDICAO);
				
		//Alterar Cadastro
		pageCadastro.digitarNome(ufAlterado.getNome());
		pageCadastro.digitarSigla(ufAlterado.getSigla());
		pageList = pageCadastro.clicarLinkAlterar();
					
		//Verificações
		Assert.assertEquals("Entidade atualizada com sucesso.",pageList.pegarMensagem());			
		Assert.assertTrue(pageList.isRegistroPresente(UFListPage.NOME_COLUNA_NOME,ufAlterado.getNome()));
		Assert.assertTrue(pageList.isRegistroPresente(UFListPage.NOME_COLUNA_SIGLA, ufAlterado.getSigla()));
		Assert.assertFalse(pageList.isRegistroPresente(UFListPage.NOME_COLUNA_NOME, uf.getNome()));
		Assert.assertFalse(pageList.isRegistroPresente(UFListPage.NOME_COLUNA_SIGLA, uf.getSigla()));		
	}
	
	@Test(dependsOnMethods={"editarUF"},	
			dataProvider="proverUFDelecao", 
			dataProviderClass=UFProvedorDeDados.class)
	public void apagarUFPelaListagem(UFDTO uf){
		//Acessa página inicial
		page = new InicialPage(this.driver);
		
		//Acessa página de listagem de Ufs
		pageList = page.clicarMenuUF();
				
		Assert.assertTrue(pageList.isRegistroPresente(UFListPage.NOME_COLUNA_NOME, uf.getNome()),"Registro não encontrado na listagem.");
	
		//Injeção de JavaScript pois não existe função para tratar com alerts e confirms 
		((JavascriptExecutor) driver).executeScript("window.confirm = function(msg) { return true; }");
		
		pageList.clicarApagar(UFListPage.NOME_COLUNA_NOME, uf.getNome(), UFListPage.NOME_COLUNA_APAGAR);
		
		//Verificações
		Assert.assertEquals("Entidade excluída com sucesso.",pageList.pegarMensagem());
		Assert.assertFalse(pageList.isRegistroPresente(UFListPage.NOME_COLUNA_NOME, uf.getNome()));
		Assert.assertFalse(pageList.isRegistroPresente(UFListPage.NOME_COLUNA_SIGLA, uf.getSigla()));		
	}
}
